Skip to content

vk_api.exceptions.AuthError: Unknown error (AUTH; no sid)#522

Merged
python273 merged 5 commits intopython273:masterfrom
kyzima-spb:master
Feb 10, 2025
Merged

vk_api.exceptions.AuthError: Unknown error (AUTH; no sid)#522
python273 merged 5 commits intopython273:masterfrom
kyzima-spb:master

Conversation

@kyzima-spb
Copy link
Copy Markdown
Contributor

@kyzima-spb kyzima-spb commented Feb 2, 2025

Новая "форма" входа, с сохранением старой формы

Что было добавлено:

  1. Новый модуль credentials с классом WebLoginCredentials - все данные, нужные для процесса входа с "новой" формой. Не захотелось хардкодить, поэтому вынес в отдельный класс
  2. Перечисление VerificationMethod в модуле enums - все известные на текущий момент имена способов подтверждения входа в аккаунт
  3. Изменен метод vk_api.VkApi.method:
    1. Добавлен новый аргумент with_cookies, он позволяет не затирать текущие сессионные куки и вызывать "внутренние" методы API, которым для аутентификации пользователя вместо токена доступа нужны куки. По-умолчанию имеет значение False, поэтому поведение библиотеки не изменилось
    2. Если в аргументе-словаре values был явно передан токен доступа (ключ access_token) - использовать его, иначе поведение библиотеки по умолчанию. Во-первых, была ошибка, если токен ранее сохранен в конфиге, но аутентификация проходит повторно - некоторые "внутренние" методы API падали с ошибкой о не возможности одновременно использовать и куки, и токен. Во-вторых, это может быть полезно для вызова "внутренних" методов, например video.getVideoDiscover, с токеном, отличным от получаемого библиотекой. В-третьих, "внутренние" методы тоже могут просить капчу и DRY =)
  4. Функция generate_device_id в модуле utils - исходник взят из JS файла ВК, хотя можно генерировать и случайное значение, думаю лучше брать оригинал, чтобы меньше "палиться"
  5. Дополнительные классы исключений - думаю пояснять не нужно =)

С remember_device я так и не смог разобраться, мне кажется эту функцию убрали. Если кому-то это критично, то думаю смогут допилить самостоятельно и кинуть PR

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

kyzima-spb commented Feb 2, 2025

Исправил ошибку с капчей, которую пропустил - не вылезала никогда в этом месте капча =)

Добавил метод vk_api.VkApi.vk_login_method для запросов к login.vk.com и обработки капчи

Comment thread vk_api/utils.py Outdated
The implementation is taken from the VK source code.
"""
charset = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
return ''.join(random.choice(charset) for _ in range(n))
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

random не безопасный, лучше из secrets взять.

The implementation is taken from the VK source code.

Это можно убрать, это из nanoid. Строку лучше просто отсортированную вставить

Comment thread vk_api/vk_api.py Outdated

credentials.sid = account['sid']

verification_method = account['next_step']['verification_method']
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

KeyError: 'next_step'

{"response":{"is_phone":true,"flow_name":"need_password_and_validation","flow_names":["password"],"sid":"loginvalidate_abababababababababababababababab"}}

в вк просило ввод кода перед входом и только потом пароль, может в этом дело

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да у них так всегда теперь =) Хм, это значит он звонок на телефон сделал, попробую сэмулировать такое поведение

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужно больше информации =)

  1. В аккаунте включена двухфакторная аутентификация?
  2. Какие способы посылки кода предлагает ВК?
  3. Когда не пришел next_step, ВК сам прислал какой-то код или звонок?

Copy link
Copy Markdown
Owner

@python273 python273 Feb 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Только номер + пароль
  2. Ничего не предлагает, сейчас только пароль спросил и сразу зашло в браузере
  3. Коды не присылаются после фейла

скинь как твой респонз выглядит. Есть enable_debug_mode(vk_session, print_content=True) чтобы запросы в консоль печатать

Copy link
Copy Markdown
Owner

@python273 python273 Feb 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если закомментить от verification_method = account['next_step']['verification_method'] и if ниже, то проходит логин

но не знаю как звонок проходить, на нем наверное ломаться будет

Copy link
Copy Markdown
Contributor Author

@kyzima-spb kyzima-spb Feb 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

скинь как твой респонз выглядит

{"response":{"is_phone":true,"flow_name":"need_password","flow_names":["password","otp"],"sid":"loginvalidate_********","next_step":{"verification_method":"sms","has_another_verification_methods":true},"remember_hash":"*******"}}

Свежий аккаунт, в нем одноразовые пароли через смс (иногда звонок делает). Хитрым образом я таки задал пароль. 2fa отключен

Меня смущает, что в моих аккаунтах где включен 2fa - flow_name равен need_password_and_validation, почему я и спросил, включено оно или нет

Один раз я падал с ошибкой, что ключа нет, но решил, что это случайная бага из-за битого конфига или типо того, потому что ни разу на всех 4-х аккаунтах оно не вылезало

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

то проходит логин

потому что есть пароль и 2fa отключено, видимо оставлено для старых аккаунтов, но при этом в браузере просит код

Copy link
Copy Markdown
Contributor Author

@kyzima-spb kyzima-spb Feb 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Итог, для двух аккаунтов с телефоном, паролем и отключенным 2fa - стабильно приходит ответ без next_step. Я думаю в этой ситуации можно смело логиниться с паролем, т.к. похоже в случае одноразовых паролей next_step приходит стабильно

Еще один интересный момент, при каких-то условиях на шаге ввода пароля под кнопкой продолжить появилась ссылка на другие варианты. И я получил еще один метод апи, который сам определяет вариант подтверждения и высылает смс или звонок

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

@python273 пока я анализировал ответы от разных аккаунтов и придумывал, как лишний раз не вводить код подтверждения, ВК опять что-то изменил и убрал окончательно пароли без 2fa =) Так что пошел по пути наименьшего сопротивления =)

@kyzima-spb kyzima-spb requested a review from python273 February 6, 2025 13:26
Comment thread vk_api/exceptions.py
Comment on lines +51 to +65
class ParseError(AuthError):
"""Любая ошибка при парсинге исходных кодов сайта."""


class AuthorizeError(AuthError):
"""
Любая ошибка, которая может возникнуть в момент авторизации
существующего пользователя с проверенным кодом подтверждения или паролем.
(https://login.vk.com/?act=connect_authorize)
"""
def __init__(self, error: t.Dict[str, t.Any]) -> None:
self.error = error

def __str__(self) -> str:
return '[{error_code}] {error_info}'.format(**self.error)
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не думаю нужно отдельные ошибки, можно просто AuthError. Смысл отдельные добавлять только если их обрабатывать как-то можно

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AuthError базовый тип, к нему по логике не возможно добавить какую-то дополнительную информацию об ошибке. Вызовы к login возвращают стандартизированный ответ, в котором есть error_code и другая информация об ошибке. Я думаю могут быть ситуации, когда пользователю библиотеки эта информация пригодится =)

ParseError возможно действительно лишний. В любом случае позже я хочу добавить вход по qr-коду и посмотрю свежим взглядом, пусть пока "полежит" =)

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такое можно просто в текст ошибки, обрабатывать это все равно норм не получится. Можно конечно в AuthError добавить поле для какой-то общей error_metadata и туда сувать всякое, но тоже не уверен есть ли смысл

Comment thread vk_api/vk_api.py

return response if raw else response['response']

def vk_login_method(
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

нужно _ добавить в начале

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не соглашусь, этот метод может быть частью интерфейса библиотеки, т.к. у login (как и у api) есть разные полезные методы. Например, я использую эту точку для получения веб токена, который нужен для прямых ссылок на видео

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хмм, слишком internal выглядит для добавления в интерфейс (с data и headers), я бы себе такое в код копировал, а не из библиотеки вызывал

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

да не очень =) data - это как values у method, можно переименовать для согласованности, хоть меня оно и смущает и привычнее data из requests =)

для заголовков нужно больше действий подергать и посмотреть, нужны ли разные данные или можно жестко зашить origin и content-type, второй в принципе и не нужен, оно и так должно отправить как форму

@python273 python273 merged commit 237cd3a into python273:master Feb 10, 2025
@python273
Copy link
Copy Markdown
Owner

python273 commented Feb 11, 2025

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.vk.com:443
DEBUG:urllib3.connectionpool:https://api.vk.com:443 "POST /method/auth.validateAccount HTTP/1.1" 200 199
INFO:vk_api:Confirmation code is required
DEBUG:urllib3.connectionpool:https://api.vk.com:443 "POST /method/ecosystem.sendOtpPush HTTP/1.1" 200 126
INFO:vk_api:Confirmation code sent via push to the iPhone 14 Pro, status 0.
ERROR:root:Authentication failed: No handler for two-factor authentication


Хотя можно зайти по паролю, но говорит что аккаунт 2фа

пишут не всегда пароль выбирает для логина, хотя он доступен в опциях на сайте

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

kyzima-spb commented Feb 11, 2025

@python273 это происходит потому что ВК теперь форсирует отправку кода, даже если можно войти по паролю. Ответ ВК никак не стандартизирован и по нему не возможно понять, когда включена 2fa, а когда беспарольный вход - получается гадание на кофейной гуще

Единственный 100% способ, это сделать еще один запрос к api для получения списка доступных методов и если среди них есть пароль, можно пробовать входить, но для включенной 2fa или беспарольного входа - получается узкий случай

Добавить можно, если критично, только я свой подходящий аккаунт запорол и проверить не смогу =( Нужен такой, где отключен 2fa, но остался пароль и где метод validateAccount вернет ключ flow_names = ['password', 'otp']

Copy link
Copy Markdown
Contributor Author

@kyzima-spb kyzima-spb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Убрал исключения, сделал принудительную проверку способов подтверждения входа на наличие пароля - лишний запрос, но ответы ВК не стандартизированы, по другому не получится

@Ponkase
Copy link
Copy Markdown

Ponkase commented Feb 12, 2025

Убрал исключения, сделал принудительную проверку способов подтверждения входа на наличие пароля - лишний запрос, но ответы ВК не стандартизированы, по другому не получится

В целом ситуация стала лучше, установил вашу репу, авторизации пошли нормально, и почти нет той проблемы которая описовалась выше

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

почти нет той проблемы

почему почти?

@Ponkase
Copy link
Copy Markdown

Ponkase commented Feb 12, 2025

почти нет той проблемы

почему почти?

на некоторых продолжает вылазить INFO:vk_api:Confirmation code sent via push to the iPhone 14 Pro, status 0.
ERROR:root:Authentication failed: No handler for two-factor authentication но значительно меньше чем до установка вашей репы

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

Я думаю это защита ВК, он в принципе жонглирует разными способами подтверждения: то смс, то звонок, то капчи сыплет одну за одной, а то и по несколько подряд, один раз меня просто забанил на сутки =) На одном аккаунте, где нет next_step и железобетонно должен просить пароль, в какой-то момент он отправил смс-ку, хорошо я сохранил эти запросы на всякий случай, т.к. если нет next_step, то не возможно узнать способы подтверждения и отправить код =)

Разницы между телефоном или почтой я не заметил - поведение одинаковое. Ответы не стандартизированы, т.е. я не могу 100% понять включена ли 2fa по ним, как и включены ли otp

на некоторых продолжает вылазить

но пароль есть? 100% защита со стороны ВК

ERROR:root:Authentication failed: No handler for two-factor authentication

на текст ошибки можно внимания не обращать, auth_handler сейчас просит код для 2fa и для otp. Я не стал трогать этот код, потому что вдруг еще где-то старая форма входа вылезет и чтобы не ломать чужой код. В будущем (полгодика думаю норм подождать), если автор не против, я бы сделал рефакторинг и убрал весь legacy код с сохранением совместимости с чужим кодом =)

@Ponkase
Copy link
Copy Markdown

Ponkase commented Feb 12, 2025

Я думаю это защита ВК, он в принципе жонглирует разными способами подтверждения: то смс, то звонок, то капчи сыплет одну за одной, а то и по несколько подряд, один раз меня просто забанил на сутки =) На одном аккаунте, где нет next_step и железобетонно должен просить пароль, в какой-то момент он отправил смс-ку, хорошо я сохранил эти запросы на всякий случай, т.к. если нет next_step, то не возможно узнать способы подтверждения и отправить код =)

Разницы между телефоном или почтой я не заметил - поведение одинаковое. Ответы не стандартизированы, т.е. я не могу 100% понять включена ли 2fa по ним, как и включены ли otp

на некоторых продолжает вылазить

но пароль есть? 100% защита со стороны ВК

ERROR:root:Authentication failed: No handler for two-factor authentication

на текст ошибки можно внимания не обращать, auth_handler сейчас просит код для 2fa и для otp. Я не стал трогать этот код, потому что вдруг еще где-то старая форма входа вылезет и чтобы не ломать чужой код. В будущем (полгодика думаю норм подождать), если автор не против, я бы сделал рефакторинг и убрал весь legacy код с сохранением совместимости с чужим кодом =)

Пароль есть 100%, понял

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

Пароль есть

Попробуйте включить вывод запросов и посмотреть, что он вернет при вызове ecosystem.getVerificationMethods? Судя по всему пароля там быть не должно, раз просит код

from vk_api.utils import enable_debug_mode
.....
enable_debug_mode(vk_session, print_content=True)

Будет здорово, если возьмете исходник, закомментируйте мою строчку и проверите этот случай, строчка не будет отправлять код подтверждения и вы перейдете сразу к вводу пароля, что ВК скажет на такой финт? =)

self._pass_confirmation_code(next_step['verification_method'], credentials)

@Ponkase
Copy link
Copy Markdown

Ponkase commented Feb 28, 2025

ERROR - Неожиданная ошибка: HTTPSConnectionPool(host='login.vk.com', port=443): Max retries exceeded with url: /?act=connect_internal (Caused by ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 503 Service Unavailable'))) Хотя прокси рабочие, и очень часто такая ошибка стала появлятся

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

ERROR - Неожиданная ошибка: HTTPSConnectionPool(host='login.vk.com', port=443): Max retries exceeded with url: /?act=connect_internal

Аргумент token_only в методе auth True или False? Или если посмотреть логи, то фраза access_token from config is not valid часто появляется?

Имхо, беглым взглядом посмотрел код, где вызывается этот метод и, если верно понял, то он вызывается только в случаях, если токен стал не валидным или если куки проверяются на актуальность. Они не должны на столько быстро "протухать", чтобы так часто вызывался этот метод

@Ponkase
Copy link
Copy Markdown

Ponkase commented Mar 2, 2025

ERROR - Неожиданная ошибка: HTTPSConnectionPool(host='login.vk.com', port=443): Max retries exceeded with url: /?act=connect_internal

Аргумент token_only в методе auth True или False? Или если посмотреть логи, то фраза access_token from config is not valid часто появляется?

Имхо, беглым взглядом посмотрел код, где вызывается этот метод и, если верно понял, то он вызывается только в случаях, если токен стал не валидным или если куки проверяются на актуальность. Они не должны на столько быстро "протухать", чтобы так часто вызывался этот метод

я по логину паролю вхожу

@Ponkase
Copy link
Copy Markdown

Ponkase commented Mar 3, 2025

ERROR - Ошибка авторизации: Failed to get the value of variable window.init. теперь вот такая ошибка

@kyzima-spb
Copy link
Copy Markdown
Contributor Author

Failed to get the value of variable window.init

Это означает, что страница с данными для логина не была загружена корректно. Я проверил у себя аккаунт с логином и паролем, ошибок нет

Без логов здесь вряд ли кто-то вам сможет помочь

@Ponkase
Copy link
Copy Markdown

Ponkase commented Mar 4, 2025

Failed to get the value of variable window.init

Это означает, что страница с данными для логина не была загружена корректно. Я проверил у себя аккаунт с логином и паролем, ошибок нет

Без логов здесь вряд ли кто-то вам сможет помочь

Извиняюсь ложная тревога, вчера вечером вк лежал

@Ponkase
Copy link
Copy Markdown

Ponkase commented Apr 10, 2025

Здравствуйте заметил проблему, если в логине номер и пароль верный то входит, а если в логине email - то говорит неверный пароль, хотя через браузер по этому же емейлу входит без проблем

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants